home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / lpc10 / ivfilt.c < prev    next >
C/C++ Source or Header  |  2000-05-18  |  1KB  |  57 lines

  1. /**********************************************************************
  2. *
  3. *    IVFILT Version 48
  4. *
  5. **********************************************************************
  6. *
  7. *   2nd order inverse filter, speech is decimated 4:1
  8. *
  9. * Inputs:
  10. *  LEN    - Length of speech buffers
  11. *  NSAMP  - Number of samples to filter
  12. *  LPBUF  - Low pass filtered speech buffer
  13. * Output:
  14. *  IVBUF  - Inverse filtered speech buffer
  15. *  IVRC   - Inverse filter reflection coefficients (for voicing)
  16. */
  17.  
  18. #include "config.ch"
  19. #include "lpcdefs.h"
  20.  
  21. ivfilt( lpbuf, ivbuf, ivrc )
  22. float ivbuf[], lpbuf[], ivrc[];
  23. {
  24. int i, j, k;
  25. float r[3], pc1, pc2;
  26.  
  27. /*  Calculate Autocorrelations    */
  28. for(i=0;i<=2;i++)    {
  29.     r[i] = 0.;
  30.     k = 4*i;
  31.     for( j = (i+1)*4+PWLEN-LFRAME;j<=PWLEN;j+=2)    {
  32.         r[i] += lpbuf[j]*lpbuf[j-k];
  33.     }
  34. }
  35.  
  36. /*  Calculate predictor coefficients    */
  37.  
  38. pc1 = 0.;
  39. pc2 = 0.;
  40. ivrc[1] = 0.;
  41. ivrc[2] = 0.;
  42. if(r[0]>0.000001) {
  43.     ivrc[1] = r[1]/r[0];
  44.     ivrc[2] = (r[2]-ivrc[1]*r[1]) / (r[0]-ivrc[1]*r[1]);
  45.     pc1 = ivrc[1] - ivrc[1]*ivrc[2];
  46.     pc2 = ivrc[2];
  47. }
  48.  
  49. /*  Inverse filter LPBUF into IVBUF    */
  50.  
  51. for(i=PWLEN+1-LFRAME;i<=PWLEN;i++) {
  52.     ivbuf[i] = lpbuf[i] - pc1*lpbuf[i-4] - pc2*lpbuf[i-8];
  53. }
  54.  
  55.  
  56. }
  57.